package com.sunfeng.common.group;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 自定义校验注解
 *  注意点:
 *  1、只有当注解中有 value 成员变量时，才可以不传 key，因为它默认是将值赋给 value 成员变量的；
 *  2、成员变量没有使用 default 定义默认值，在使用注解时，就必须要对它进行赋值，有默认值则可以不必赋值；
 *  3、如果只有一个参数成员，一般参数名为 value；
 *  4、but does not contain a groups parameter 注解需要定义成员变量 groups
 *  5、xxx contains Constraint annotation, but does not contain a payload parameter. 注解需要定义成员变量 Payload
 */
@Documented
@Constraint(
        validatedBy = {ListValueConstraintValidator.class}
)
//@Target 指定了注解运用的地方，规定了只能张贴到方法上、类上、方法参数上等等。
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    // 约束注解验证时的输出消息
    String message() default "{com.sunfeng.common.group.ListValue.message}";
    // 约束注解在验证时所属的组别
    Class<?>[] groups() default {};
    // 约束注解的有效负载
    Class<? extends Payload>[] payload() default {};

    int[] values() default {};
}
